/**
 * _data Data对象 操作函数集
 * 2018年11月14日 11点41分
 * nico@coser.pub
 */

/**
 * _listeningData 添加路径变动监控器
 * @param string path 路径
 * @param function callback 回调函数
 * @param boolean isBefore 是否发生在变动前
 */
function _listeningData(path, callback, isBefore) {}
/**
 * _saveData 根据路径设置值
 * @param string path 路径
 * @param mix value 需要设置的值
 */
function _saveData(path, value) {}
/**
 * _getData 根据路径获取值
 * @param string path 路径
 * @param mix value 为空时的默认值
 */
function _getData(path, value) {}

module.exports._init = function(){
  let aimList = [];
  let aimCallbackInBefore = {};
  let aimCallbackInAfter = {};
  /**
   * _listeningData 添加路径变动监控器
   * @param string path 路径
   * @param function callback 回调函数
   * @param boolean isBefore 是否发生在变动前
   */
  this._listeningData = function(path, callback, isBefore){
    if(aimList.indexOf(patth) == -1){
      aimList.concat(path);
    } 
    (isBefore ? aimCallbackInBefore : aimCallbackInAfter)[path] = callback;
  }
  /**
   * _saveData 根据路径设置值
   * @param string path 路径
   * @param mix value 需要设置的值
   */
  this._saveData = function (path, value) {

    let old = pathBrowser(path, this);

    if (aimCallbackInBefore[path]) aimCallbackInBefore[path](old, value);
    let result = pathBrowser(path, this, value);
    if (aimCallbackInAfter[path]) aimCallbackInAfter[path](old, value);
    let root = path.split("/")[0];
    let obj = {};obj[root] = this[root];
    this.setData(obj);
    return result;
  }
  /**
   * _getData 根据路径获取值
   * @param string path 路径
   * @param mix value 为空时的默认值
   */
  this._getData = function (path, value) {
    let result = pathBrowser(path, this);
    return (typeof result == 'undefined') ? value : result;
  }
}

/**
 * pathBrowser - 路径浏览器工具
 * @param string path 路径
 * @param object treeObject 要访问的树对象
 * @param string [setValue] 设置的值 
 */
function pathBrowser(path, treeObject, setValue){
  let pathArray = path.split("/");
  let node = treeObject;

  for (let i = 0; i < pathArray.length - 1; i++) {
    if (typeof node[pathArray[i]] == 'undefined') {
      node[pathArray[i]] = {}
    }
    node = node[pathArray[i]];
  }
  if (arguments.length==3){
    node[pathArray[pathArray.length - 1]] = setValue;
  }
  return node[pathArray[pathArray.length - 1]];
}

